# -*- coding: utf-8 -*-
import os
import subprocess

def compress_video(input_file, output_file=None):
    """
    压缩视频文件，支持不同格式转换为MP4，并进行无损压缩。
    
    :param input_file: 输入视频文件路径
    :param output_file: 输出视频文件路径（如果为None，则自动生成）
    """
    # 如果输出文件未指定，则根据输入文件生成默认输出文件名
    if output_file is None:
        base_name, ext = os.path.splitext(input_file)
        output_file = f"{base_name}_compressed.mp4"
    
    # 检查输入文件是否存在
    if not os.path.exists(input_file):
        print(f"错误：文件 {input_file} 不存在")
        return
    
    # 获取输入文件的扩展名
    # _ 的意思是忽略返回的第一个值，只获取第二个值，即扩展名
    _, input_ext = os.path.splitext(input_file)
    
    # 如果输入文件已经是mp4格式，则不需要进行格式转换
    if input_ext.lower() == '.mp4':
        print("视频已经是MP4格式，跳过格式转换，直接进行压缩...")
    else:
        print("视频不是MP4格式，先进行格式转换...")
    
    try:
        # 构建ffmpeg命令
        command = [
            'ffmpeg',
            '-i', input_file,          # 输入文件
            '-vcodec', 'libx264',      # 使用H.264编码器
            '-crf', '23',              # CRF值控制质量，范围0-51，越小质量越高，23是默认值
            '-preset', 'medium',       # 压缩速度与压缩率的平衡，可选值：ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow
            '-acodec', 'aac',          # 音频编码器
            '-b:a', '128k',            # 音频比特率
            output_file                # 输出文件
        ]
        
        # 执行ffmpeg命令
        subprocess.run(command, check=True)
        print(f"视频已成功压缩并保存为 {output_file}")
    
    except subprocess.CalledProcessError as e:
        print(f"视频压缩失败：{e}")

if __name__ == "__main__":
    # 示例：压缩视频
    input_video = "v0.dev.mp4"  # 输入视频文件路径
    compress_video(input_video)